package com.latam.arq.example.web.managedbeans;


 

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.bean.SessionScoped;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import org.primefaces.context.RequestContext;
import org.primefaces.event.SelectEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.latam.arq.commons.exceptions.LATAMException;
import com.latam.arq.commons.web.utils.MessageUtil;
import com.latam.arq.example.crud.ejb.services.AccionIntervencionCRUDService;
import com.latam.arq.example.crud.ejb.services.AdmisionCRUDService;
import com.latam.arq.example.crud.ejb.services.CabeceraCRUDService;
import com.latam.arq.example.crud.ejb.services.DetalleCRUDService;
import com.latam.arq.example.crud.ejb.services.IsapreCRUDService;
import com.latam.arq.example.crud.ejb.services.PacienteCRUDService;
import com.latam.arq.example.crud.ejb.services.PamCRUDService;
import com.latam.arq.example.crud.ejb.services.PrestacionIsapreCRUDService;
import com.latam.arq.example.crud.ejb.services.ProfesionalCRUDService;
import com.latam.arq.example.domain.AccionIntervencionBean;
import com.latam.arq.example.domain.AdmisionBean;
import com.latam.arq.example.domain.CabeceraBean;
import com.latam.arq.example.domain.DetalleBean;
import com.latam.arq.example.domain.ExampleBean;
import com.latam.arq.example.domain.IsapreBean;
import com.latam.arq.example.domain.PacienteBean;
import com.latam.arq.example.domain.PamBean;
import com.latam.arq.example.domain.PrestacionIsapreBean;
import com.latam.arq.example.domain.ProfesionalBean;
import com.latam.arq.example.persistence.exceptions.ExampleBeanServiceException;
import com.latam.arq.example.persistence.services.AccionIntervencionBeanServices;

 
@ManagedBean(name = "admisionListenerMB")
@ViewScoped
public class AdmisionListenerMB {
	
	private static final Logger logger = LoggerFactory.getLogger(AdmisionListenerMB.class);
         
	@EJB
	private AdmisionCRUDService admisionEJBServices;
	@EJB
	private PacienteCRUDService pacienteEJBServices;
	@EJB
	private IsapreCRUDService isapreEJBServices;
	@EJB
	private ProfesionalCRUDService profesionalEJBServices;
	@EJB
	private AccionIntervencionCRUDService tipoIntervencionEJBServices;
	@EJB
	private PrestacionIsapreCRUDService prestacionIsapreEJBServices;
	
	@EJB
	private DetalleCRUDService detalleEJBServices;
	
	@EJB
	private CabeceraCRUDService cabeceraEJBServices;
	

	
	private DetalleBean detalle ;
	
	private boolean saved;
	private boolean existeEnAdmision = false;
	
	private boolean puedoAgregar = false;
	
	

	
	
	
		
	public boolean isPuedoAgregar() {
		return puedoAgregar;
	}

	public void setPuedoAgregar(boolean puedoAgregar) {
		this.puedoAgregar = puedoAgregar;
	}

	public boolean isExisteEnAdmision() {
		return existeEnAdmision;
	}

	public void setExisteEnAdmision(boolean existeEnAdmision) {
		this.existeEnAdmision = existeEnAdmision;
	}

	private int cantidad;
	
	private int numPam;
	
	private CabeceraBean cabecera ;
	
	private String tipoPam;
	private String[] tipoAtencioList;
	private String tienePrestacion;
	private String tipoAtencioString;
	
	
	
	
	
	  public String getTienePrestacion() {
		return tienePrestacion;
	}

	public void setTienePrestacion(String tienePrestacion) {
		this.tienePrestacion = tienePrestacion;
	}

	public void cargaTiposPam() throws ExampleBeanServiceException, LATAMException {
		  
			logger.debug(this.getTipoPam());
	 }
	  
	  
		
	  public void cargaPrestacion() throws ExampleBeanServiceException, LATAMException {
		  
			logger.debug(this.getTienePrestacion());
	 }
	  
	  
		
	  public void cargaTipoAtencion() throws ExampleBeanServiceException, LATAMException {
		 for (int i = 0; i <  this.getTipoAtencioList().length; i++) {
			 logger.debug(  "Tipo Atencion");
			 logger.debug(  this.getTipoAtencioList()[i]);
		}
	 }
	  


	public String getTipoPam() {
		return tipoPam;
	}

	public void setTipoPam(String tipoPam) {
		this.tipoPam = tipoPam;
	}

	public String[] getTipoAtencioList() {
		return tipoAtencioList;
	}

	public void setTipoAtencioList(String[] tipoAtencioList) {
		this.tipoAtencioList = tipoAtencioList;
	}


	public String getTipoAtencioString() {
		return tipoAtencioString;
	}

	public void setTipoAtencioString(String tipoAtencioString) {
		this.tipoAtencioString = tipoAtencioString;
	}

	public CabeceraBean getCabecera() {
		return cabecera;
	}

	public void setCabecera(CabeceraBean cabecera) {
		this.cabecera = cabecera;
	}

	public DetalleBean getDetalle() {
		return detalle;
	}

	public void setDetalle(DetalleBean detalle) {
		this.detalle = detalle;
	}

	public boolean isSaved() {
		return saved;
	}

	public void setSaved(boolean saved) {
		this.saved = saved;
	}

	public int getNumPam() {
		return numPam;
	}

	public void setNumPam(int numPam) {
		this.numPam = numPam;
	}

	public Integer getCantidad() {
		return cantidad;
	}

	public void setCantidad(Integer cantidad) {
		this.cantidad = cantidad;
	}

	private PacienteBean paciente;
	private PacienteBean beneficiario;
	
	private AdmisionBean admision ;	
	private IsapreBean isapre ;	
	private ProfesionalBean profesional;
	
	private ProfesionalBean profesionalAyudante;
	private AccionIntervencionBean tipoIntervencion;
	
	private PrestacionIsapreBean prestacionIsapre;
	
	
	 private List<AccionIntervencionBean> tipoIntervencionList;
	 
	 
	 private String rut;
	 
	 private Integer codigoPrestacion;
	 private String nombrePrestacion;


	 private List<DetalleBean> detalleBeanList;
	 
	 
	 public String getNombrePrestacion() {
		return nombrePrestacion;
	}

	public void setNombrePrestacion(String nombrePrestacion) {
		this.nombrePrestacion = nombrePrestacion;
	}


	
	
	public Integer getCodigoPrestacion() {
		return codigoPrestacion;
	}

	public void setCodigoPrestacion(Integer codigoPrestacion) {
		this.codigoPrestacion = codigoPrestacion;
	}

	public PrestacionIsapreBean getPrestacionIsapre() {
		return prestacionIsapre;
	}

	public void setPrestacionIsapre(PrestacionIsapreBean prestacionIsapre) {
		this.prestacionIsapre = prestacionIsapre;
	}

	public String getRut() {
		return rut;
	}

	public void setRut(String rut) {
		this.rut = rut;
	}

	public AccionIntervencionBean getTipoIntervencion() {
		return tipoIntervencion;
	}

	public void setTipoIntervencion(AccionIntervencionBean tipoIntervencion) {
		this.tipoIntervencion = tipoIntervencion;
	}

	public List<AccionIntervencionBean> getTipoIntervencionList() {
		return tipoIntervencionList;
	}

	public void setTipoIntervencionList(
			List<AccionIntervencionBean> tipoIntervencionList) {
		this.tipoIntervencionList = tipoIntervencionList;
	}

	public ProfesionalBean getProfesionalAyudante() {
		return profesionalAyudante;
	}

	public void setProfesionalAyudante(ProfesionalBean profesionalAyudante) {
		this.profesionalAyudante = profesionalAyudante;
	}

	public ProfesionalBean getProfesional() {
		return profesional;
	}

	public void setProfesional(ProfesionalBean profesional) {
		this.profesional = profesional;
	}

	public PacienteBean getBeneficiario() {
		return beneficiario;
	}

	public void setBeneficiario(PacienteBean beneficiario) {
		this.beneficiario = beneficiario;
	}

	public PacienteBean getPaciente() {
		return paciente;
	}

	public void setPaciente(PacienteBean paciente) {
		this.paciente = paciente;
	}

	@PostConstruct
	  public void init() throws ExampleBeanServiceException, LATAMException {
		 	this.admision = new AdmisionBean();
		 	this.paciente = new PacienteBean();
		 	this.beneficiario = new PacienteBean();
		 	this.isapre = new IsapreBean();
		 	this.profesional = new ProfesionalBean();
		 	this.profesionalAyudante = new ProfesionalBean();
		 	this.tipoIntervencion = new AccionIntervencionBean();
			this.setTipoIntervencionList(tipoIntervencionEJBServices.list());
		 	this.rut = new String();
			this.detalleBeanList = new ArrayList<DetalleBean>();
			this.saved = true;
			this.detalle = new DetalleBean();
			this.cabecera = new CabeceraBean();
			
			this.tipoPam = new String();
			this.tienePrestacion= new String();
			this.tipoAtencioString= new String();
			
			
			
			
	 }
	
	
	  public void chargeTable() throws ExampleBeanServiceException, LATAMException {
		  
			this.setDetalleBeanList(this.detalleEJBServices.getByNumPam(this.getNumPam()));
	 }
	
    public IsapreBean getIsapre() {
		return isapre;
	}

	public void setIsapre(IsapreBean isapre) {
		this.isapre = isapre;
	}

	public AdmisionBean getAdmision() {
		return admision;
	}

	public void setAdmision(AdmisionBean admision) {
		this.admision = admision;
	}

	public void openDialog() {
        RequestContext.getCurrentInstance().openDialog("selectorAdmisionForm");
    }
	

    public void searchCabeceraKeyEvent() throws LATAMException, ExampleBeanServiceException {
    	if( this.getCabecera().getRol()!= null)
    	{
    		List<AdmisionBean> admisionList =  admisionEJBServices.getByRol(this.getCabecera().getRol());
    		if(admisionList.size() > 0 ){
    			
        		AdmisionBean admision = admisionList.get(0);
		    	PacienteBean beneficiario = this.pacienteEJBServices.getByRut(admision.getPacienterutpaciente());
		    	PacienteBean afiliado =  this.pacienteEJBServices.getByRut(admision.getRutAfiliado());
		    	IsapreBean isapre = this.isapreEJBServices.getByRut(admision.getRutIsapre());
		    	ProfesionalBean profesional = this.profesionalEJBServices.getByRut(admision.getProfesionalrutprofesional());
				this.setPaciente(this.pacienteEJBServices.getByRut(admision.getPacienterutpaciente()));
		    	this.setBeneficiario(beneficiario);
		    	this.setIsapre(isapre);
		    	this.setProfesional(profesional);		
	    	
		    	this.cabecera.setId(null);
		//    	this.cabecera.setFechaCreacion(new Date());
		    	this.cabecera.setRutIsapre(isapre.getRut());
		    	this.cabecera.setRutBeneficiario(beneficiario.getRutpaciente());
		    	this.cabecera.setNombreBeneficiario(beneficiario.getNombrepaciente());
		    	
		    	if(afiliado != null){
		    		this.cabecera.setRutAfiliado(afiliado.getRutpaciente());
			    	this.cabecera.setNombreAfiliado(afiliado.getNombrepaciente());
			   }
		    	this.cabecera.setFechaNacimientoBeneficiario (beneficiario.getFechaNacimiento());
		    	this.cabecera.setSexo(beneficiario.getSexo().charAt(0));
		    	this.cabecera.setRutMedicoTratante(profesional.getRut());
		    	this.cabecera.setNombreMedicoTratante(profesional.getNombre());
		    	
		    	
		    	//setear choice button 
		    	
		    	 CabeceraBean cabeceraTmp =  (cabeceraEJBServices.getByRol(this.getCabecera().getRol()));
		    	if(cabeceraTmp != null){
		    		this.setTipoPam(cabeceraTmp.getTipoPam());
		    		this.setTienePrestacion(cabeceraTmp.getTienePrestacion());
		    		
		    		
		    		this.setTipoAtencioList(cabeceraTmp.getTipoAtencioString().split(";"));  		
		    		
		    	}
		    	
		    	
		    	
	//	    	if(cabeceraEJBServices.getByRol(this.getAdmision().getRolclinica())!=null){
	//	    		this.cabecera.setNumPam(cabeceraEJBServices.getByRol(this.getAdmision().getRolclinica()).getNumPam());
	//	    	}
		    	this.setExisteEnAdmision(true);
	    	}else{
	    		this.setExisteEnAdmision(false);
	    		
			 	this.admision = new AdmisionBean();
			 	this.paciente = new PacienteBean();
			 	this.beneficiario = new PacienteBean();
			 	this.isapre = new IsapreBean();
			 	this.profesional = new ProfesionalBean();
			 	this.profesionalAyudante = new ProfesionalBean();
			 	this.tipoIntervencion = new AccionIntervencionBean();
				this.setTipoIntervencionList(tipoIntervencionEJBServices.list());
			 	this.rut = new String();
				this.detalleBeanList = new ArrayList<DetalleBean>();
				this.saved = true;
				this.detalle = new DetalleBean();
				this.cabecera = new CabeceraBean();
	    	
				this.setPuedoAgregar(false);
	    		
	    	}
    	
    	}
    	

    }
    
    
    public void searchDetalleKeyEvent() throws ExampleBeanServiceException {
    	if(this.getNumPam() > 0 ){
    		this.setPuedoAgregar(true);
    		this.setDetalleBeanList(this.detalleEJBServices.getByNumPam(this.getNumPam()));
    	}else{
    		this.setPuedoAgregar(false);
    		
    	}
    }
    
    public void profesionalHandleKeyEvent() throws LATAMException {
    
    		this.detalle.setNombreProfesional(this.profesionalEJBServices.getByRut(this.getDetalle().getRutProfesional()).getNombre());
	}
    
    
    public void prestacionIsapreHandleKeyEvent() throws LATAMException {
    	
    	 PrestacionIsapreBean prestacionIsapreTmp = new PrestacionIsapreBean();

    	 prestacionIsapreTmp.setCodigoIsapre(this.getIsapre().getCodigo());
		prestacionIsapreTmp.setCodigoPrestacion(this.detalle.getCodigoPrestacion());
		this.prestacionIsapre =   this.prestacionIsapreEJBServices.get(prestacionIsapreTmp);
		this.detalle.setNombrePrestacion(prestacionIsapre.getNombrePrestacion());
		this.detalle.setValorPrestacion(prestacionIsapre.getValorPrestacion());
			
    }
    
    
    
    
	
	/**
	 * (FacesEvent)
	 * @param evt
	 * @throws LATAMException 
	 */
	public void createNew(ActionEvent evt) throws LATAMException{
		detalle = new  DetalleBean();
		this.setTipoIntervencionList(tipoIntervencionEJBServices.list());
	
		MessageUtil.addInfoMessage("exampleBeanCRUD.action.create",null);		
	}
    
	

	public List<DetalleBean> getDetalleBeanList() {
		return detalleBeanList;
	}

	public void setDetalleBeanList(List<DetalleBean> detalleBeanList) {
		this.detalleBeanList = detalleBeanList;
	}
	
	
	/**
	 * (FacesEvent)
	 * @param e
	 * @throws ExampleBeanServiceException 
	 * @throws LATAMException 
	 */
	public void saveDetalle(ActionEvent evt) throws ExampleBeanServiceException, LATAMException{
		
		
		
		
		
		cabecera.setTipoPam(this.getTipoPam());
		cabecera.setTienePrestacion(this.getTienePrestacion());
		StringBuffer buffer = new StringBuffer();
		
		if(this.getTipoAtencioList() != null){
			 for (int i = 0; i <  this.getTipoAtencioList().length; i++) {
				 buffer.append(this.getTipoAtencioList()[i]).append(";");
			}
			 cabecera.setTipoAtencioString(buffer.toString().substring(0, buffer.length()-1));
		}
		this.cabeceraEJBServices.save(cabecera);
		

		detalle.setNumPam(this.getNumPam());
		detalle.setRol(cabecera.getRol());
		
		detalle.setValorReal(detalle.getCantidad() * detalle.getValorPrestacion());
		
		this.detalleEJBServices.insert(detalle);
		chargeTable();
		MessageUtil.addInfoMessage("exampleBeanCRUD.action.save",null);
	
		
	}
    
	
	/**
	 * (FacesEvent)
	 * @param e
	 * @throws ExampleBeanServiceException 
	 * @throws LATAMException 
	 */
	public void updateDetalle(ActionEvent evt) throws ExampleBeanServiceException, LATAMException{
		detalleEJBServices.update(detalle);
		MessageUtil.addInfoMessage("exampleBeanCRUD.action.update",null);
		chargeTable();
	}		
	
	/**
	 * (FacesEvent)
	 * @param e
	 * @throws ExampleBeanServiceException 
	 * @throws LATAMException 
	 */
	public void remove(ActionEvent evt) throws ExampleBeanServiceException, LATAMException{
		detalleEJBServices.delete(detalle);
		MessageUtil.addInfoMessage("exampleBeanCRUD.action.remove",null);
		chargeTable();
	}
	
    


}